package com.itheima.test;

import com.itheima.pojo.Scores;
import com.itheima.pojo.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class 读取配置文件参数 {

/*
读取配置文件参数(参数配置化)到对象中 常用2种方式(另外还有第3种 外部配置Environment,自行百度)(.properties同.yml)

配置文件application.yml中有如下参数
student:
  name: ikun
  age: 18
  address: china
  hobby:
    - java
    - game
    - sport
  scores:
    chinese: 80
    math: 99
    english: 98


1.使用@Value注解读取一个配置参数

@Value注解常用于外部配置的属性注入,具体用法为:@Value("${配置文件中的key}")

@Component
public class Example{
    @Value("${student.name}")
    private String name;

    @Value("${student.age}")
    private Integer age;

    @Value("${student.address}")
    private String address;

    @Value("${student.hobby}")
    private String[] hobby;
}

2.使用@ConfigurationProperties(prefix="前缀名")注解一次性读取多个配置参数(封装成一个实体类,通过实体类的getXxx()方法获取其中各个配置参数)

<!--(可选依赖)@ConfigurationProperties需要添加依赖,该依赖的作用是在配置文件.yml/.properties中提示与"被@ConfigurationProperties注解标注的bean类中的成员变量名"对应的配置项的名字,驼峰命名自动变成配置文件中的横杠命名-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

定义一个与配置参数结构一致的模型类,并被Spring管理,加上@ConfigurationProperties注解指定从最外层开始的一部分作为前缀,剩余部分对应实体类对象的成员变量
@Data
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private String name;
    private Integer age;
    private String address;
    private String[] hobby;
}

@Component
@Data
@ConfigurationProperties(prefix = "student.scores")
public class Scores {
    private Integer chinese;
    private Integer math;
    private Integer english;
}

然后在需要读取的类中使用自动注入
@Autowired
private Student someone;
@Autowired
private Scores scores;
注入一个Student对象,对象当中封装的就是多个配置参数,注意成员变量名应当与配置参数的键一致



@ConfigurationProperties 与 @Value
相同点
都是用来注入外部配置的属性的。
不同点
@Value注解只能一个一个的进行外部属性的注入。
@ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中。

     */

    @Value("${student.name}")
    private String name;

    @Autowired
    private Student someone;

    @Autowired
    private Scores scores;


    @Test
    public void testProperties() {

        System.err.println("name:" + name);//name:ikun


        System.err.println("student:" + someone);//student:Student(name=ikun, age=18, address=china2, hobby=[java, game, sport])

        System.err.println("scores:" + scores);//scores:Scores(chinese=80, math=99, english=98)


    }
}


